package com.example.business.utils;

import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import lombok.extern.slf4j.Slf4j;
import org.springframework.util.StringUtils;

import java.util.Date;

/**
 * JWT 工具类
 */
@Slf4j
public final class JWTUtil {
    private static final long EXPIRATION = 86400L;
    public static final String TOKEN_PREFIX = "Bearer ";
    public static final String ISS = "index12306";
    public static final String SECRET = "SecretKey039245678901232039487623456783092349288901402967890140939827";
    /**
     * 生成用户 Token
     * @return 用户访问 Token
     */
    public static String generateAccessToken(String username) {



        String jwtToken = Jwts.builder() // 生成的 字符串 ：头部、载荷、签名
                .signWith(SignatureAlgorithm.HS256, SECRET)
                .setIssuedAt(new Date())
                .setIssuer(ISS)
                .setSubject(username) // 主题，
                .setExpiration(new Date(System.currentTimeMillis() + EXPIRATION * 1000))
                .compact();
        /**
         {
         "alg": "HS256",
         "typ": "JWT"
         }
         {
         "iss": "your-issuer",        // 签发者（由 ISS 常量指定）
         "sub": "{\"username\":\"john\",\"id\":1}",  // 主题（用户信息JSON）
         "iat": 1626547200,           // 签发时间（时间戳）
         "exp": 1626547201            // 过期时间（当前时间+1秒）
         }
         */
        return TOKEN_PREFIX + jwtToken;
    }

    /**
     * 解析用户 Token
     * @param jwtToken 用户访问 Token
     * @return 用户信息
     */
    public static String parseJwtToken(String jwtToken) {
        if (StringUtils.hasText(jwtToken)) {
            String actualJwtToken = jwtToken.replace(TOKEN_PREFIX, "");
            try {
                Claims claims = Jwts.parser().setSigningKey(SECRET).parseClaimsJws(actualJwtToken).getBody();
                Date expiration = claims.getExpiration();
                if (expiration.after(new Date())) {
                    return claims.getSubject();
                } else {
                    throw new RuntimeException("令牌已过期");

                }
            } catch (Exception ex) {
                log.error("JWT Token解析失败，请检查", ex);
                throw new RuntimeException("Token解析失败");
            }
        }
        return null;
    }
}